/**
 * Copyright (C), 2001-2031, www.bosssof.com.cn
 * FileName: CryptUtil.java
 * Author: YuXingZh
 * Date: 16/5/2024 上午10:11
 * Description:
 * 加密解密工具类
 * History:
 * Date          Author   Version  Desc
 * 2024-01-01    bosssoft  1.0.0   initialize this file
 */
package org.boss.util;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;

import static org.boss.cont.CmdCont.*;

/**
 * @className: CryptUtil
 * @description: 加密解密工具类
 * 例如：该类需要从容器获取不可以new
 * @author: YuXingZh
 * @date: 16/5/2024上午10:11
 * @since 1.0
 **/
public class CryptUtil {

    /**
     * 使用指定的密钥和加密算法加密给定的数据。
     *
     * @param data  要加密的数据
     * @param key   用于加密的密钥
     * @return 加密数据的字节数组
     */
    public static byte[] encrypt(byte[] data, String key) {
        try {
            // 使用给定的密钥创建SecretKeySpec
            Key secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);

            // 创建Cipher实例进行加密
            Cipher cipher = Cipher.getInstance(ALGORITHM);

            // 初始化Cipher为加密模式
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);

            // 加密数据
            return cipher.doFinal(data);
        } catch (Exception e) {
            // 抛出运行时异常，如果加密过程中发生错误
            throw new RuntimeException("加密数据时发生错误", e);
        }
    }

    /**
     * 使用指定的密钥和解密算法解密数据。
     *
     * @param data 待解密的数据
     * @return 解密后的数据字节数组
     */
    public static byte[] decrypt(byte[] data, String key) {
        try {
            // 创建SecretKeySpec对象
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
            // 创建Cipher实例用于解密
            Cipher cipher = Cipher.getInstance(ALGORITHM);
            // 初始化Cipher为解密模式
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            // 执行解密操作
            return cipher.doFinal(data);
        } catch (Exception e) {
            // 如果解密过程中发生错误，抛出运行时异常
            throw new RuntimeException("解密数据时发生错误", e);
        }
    }
}
